From d768b715dce90aafe93aeda4494b684dab443be3 Mon Sep 17 00:00:00 2001 From: "mwilli2@equilibrium.research" Date: Fri, 29 Oct 2004 11:15:56 +0000 Subject: [PATCH] bitkeeper revision 1.1159.1.307 (4182266cAGOQsr2Dkb1NULqhnlOgQg) Thread a linked list of ballooned pages through the mem_map array. Balloon driver should now work under migration and suspend / resume. --- .../drivers/xen/balloon/balloon.c | 106 ++++++++++++++---- 1 file changed, 86 insertions(+), 20 deletions(-) diff --git a/linux-2.6.9-xen-sparse/drivers/xen/balloon/balloon.c b/linux-2.6.9-xen-sparse/drivers/xen/balloon/balloon.c index b9ebda1785..1e2288a2e1 100644 --- a/linux-2.6.9-xen-sparse/drivers/xen/balloon/balloon.c +++ b/linux-2.6.9-xen-sparse/drivers/xen/balloon/balloon.c @@ -60,6 +60,8 @@ #include #include +#include + /* USER DEFINES -- THESE SHOULD BE COPIED TO USER-SPACE TOOLS */ #define USER_INFLATE_BALLOON 1 /* return mem to hypervisor */ #define USER_DEFLATE_BALLOON 2 /* claim mem from hypervisor */ @@ -74,11 +76,60 @@ static struct proc_dir_entry *balloon_pde; unsigned long credit; static unsigned long current_pages, most_seen_pages; -/* - * Dead entry written into balloon-owned entries in the PMT. - * It is deliberately different to INVALID_P2M_ENTRY. - */ -#define DEAD 0xdead1234 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) + +/* Head of the list of ballooned pages */ +struct page *ball_pg_hd = NULL; + +void add_ballooned_page(unsigned long pfn) +{ + struct page *p = mem_map + pfn; + + p->private = (unsigned long)ball_pg_hd; + ball_pg_hd = p; +} + +struct page *rem_ballooned_page(void) +{ + if ( ball_pg_hd != NULL ) + { + struct page *ret = ball_pg_hd; + ball_pg_hd = (struct page *)ball_pg_hd->private; + return ret; + } + else + return NULL; +} + +#else +/* List of ballooned pages, threaded through the mem_map array. */ +LIST_HEAD(ballooned_pages); + +void add_ballooned_page(unsigned long pfn) +{ + struct page *p = mem_map + pfn; + + list_add(&p->list, &ballooned_pages); +} + +struct page *rem_ballooned_page(void) +{ + if(!list_empty(&ballooned_pages)) + { + struct list_head *next; + struct page *ret; + + next = ballooned_pages.next; + ret = list_entry(next, struct page, list); + list_del(next); + + return ret; + } + else + return NULL; +} + +#endif static inline pte_t *get_ptep(unsigned long addr) { @@ -101,6 +152,7 @@ static inline pte_t *get_ptep(unsigned long addr) /* Main function for relinquishing memory. */ static unsigned long inflate_balloon(unsigned long num_pages) + { unsigned long *parray; unsigned long *currp; @@ -130,6 +182,7 @@ static unsigned long inflate_balloon(unsigned long num_pages) currp = parray; for ( j = 0; j < i; j++, currp++ ) __free_page((struct page *) (mem_map + *currp)); + ret = -EFAULT; goto cleanup; } @@ -156,7 +209,10 @@ static unsigned long inflate_balloon(unsigned long num_pages) kunmap(&mem_map[*currp]); } #endif - phys_to_machine_mapping[*currp] = DEAD; + + add_ballooned_page(*currp); + + phys_to_machine_mapping[*currp] = INVALID_P2M_ENTRY; *currp = mfn; } @@ -195,28 +251,38 @@ static unsigned long process_returned_pages(unsigned long * parray, * incorporated here. */ - unsigned long tot_pages = most_seen_pages; unsigned long * curr = parray; unsigned long num_installed; - unsigned long i; + + struct page *page; num_installed = 0; - for ( i = 0; (i < tot_pages) && (num_installed < num); i++ ) + while ( (page = rem_ballooned_page()) != NULL ) { - if ( phys_to_machine_mapping[i] == DEAD ) - { - phys_to_machine_mapping[i] = *curr; - queue_machphys_update(*curr, i); - if (i